/**
	Implementacao de uma Fila com alocacao dinamica.
	Autores: Elisangela de Assis da Silva
**/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "fila.h"

/* Inicializa a fila. */
tFila *filaInit (void) {
	tFila *q;
	q = (tFila *) malloc( sizeof( tFila ) );
	
	if ( q == NULL )
		return (NULL);

	q->tamanho = 0;
	q->inicio = NULL;
	q->fim = NULL;
	
	return (q);
}


/* Aloca um nodo na memoria e retorna um ponteiro. */
nodoptr getnodo(){
	nodoptr p;
	p = (nodoptr) malloc(sizeof(struct nodo));
	return p;
}


/* Adiciona um elemento na fila. */
void filaAdd( tFila *q, char *str1 ) {
	nodoptr n;
	n = getnodo();
	
	n->str = (char*) malloc(sizeof(char)*0);
	strcpy(n->str, str1);

	n->prox = NULL;

	if (q->fim != NULL)
		q->fim->prox = n;
	q->fim = n;

	if (q->inicio == NULL)
		q->inicio = n;
	
	q->tamanho++;

	return;
}


/* Remove um elemento da fila. */
void filaDel( tFila *q ) {
	nodoptr n;

	if (q->inicio == NULL)
		exit;

	n = q->inicio;
	q->inicio = n->prox;
	if (q->inicio == NULL){
		q->fim = NULL;
	}
	q->tamanho--;
	free(n);
	return;
}


/* Imprime todos os elementos da fila */
void filaImprime( tFila *q ) {
	int i;
	nodoptr n;
	
	n = q->inicio;
	
	for ( i = 0; i < q->tamanho; i++ ) {
		printf( "%d %s\n", i, n->str );
		n = n->prox;
	}
	
}
